package com.jwater.launch;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @description: 安装包路径获取
 * @author: jnner
 * @createDate: 2021/2/5
 * @version: 1.0
 */
public class DeployPathUtils {
    public static final String DISABLED_PREFIX = "disabled";

    /**
     * 获取安装包路径
     *
     * @param regionName
     * @param deployName
     * @param version
     * @return
     */
    public static File getDeployPath(String regionName, String deployName, Long version) {
        File dir = new File(HomePath.getRegionDeploy(regionName));
        if (!dir.exists()) {
            dir.mkdirs();
        }
        File[] files = dir.listFiles();
        for (File file : files) {
            if (file.isDirectory() && deployName.equals(file.getName())) {
                if (version == null) {
                    return getMaxVersionDir(file);
                }
                Map<Long, File> map = getVersionDirs(file);
                return map.get(version);
            }
        }
        return null;
    }

    /**
     * 获取目录下所有不同版本的安装包
     *
     * @param dir
     * @return
     */
    private static Map<Long, File> getVersionDirs(File dir) {
        Map<Long, File> map = new HashMap<Long, File>();
        File[] files = dir.listFiles();
        for (File file : files) {
            String baseName = file.getName();
            if (file.isDirectory()) {
                if (baseName.startsWith(DISABLED_PREFIX)) {
                    baseName = baseName.replace(DISABLED_PREFIX, "");
                }
                long version = Long.parseLong(baseName);
                map.put(version, file);
            }
        }
        return map;
    }

    /**
     * 获取目录下最新版本的安装包
     *
     * @param dir
     * @return
     */
    private static File getMaxVersionDir(File dir) {
        List<File> list = new ArrayList<File>();
        File[] files = dir.listFiles();
        for (File file : files) {
            String baseName = file.getName();
            if (file.isDirectory() && !baseName.startsWith(DISABLED_PREFIX)) {
                list.add(file);
            }
        }
        // 降序排序
        Collections.sort(list, (o1, o2) -> -Long.compare(Long.parseLong(o1.getName()), Long.parseLong(o2.getName())));
        if (!list.isEmpty()) {
            return list.get(0);
        }
        return null;
    }

    /**
     * 获取目录下最老版本的安装包
     *
     * @param dir
     * @return
     */
    public static File getMinVersionDir(File dir) {
        List<File> list = new ArrayList<File>();
        File[] files = dir.listFiles();
        for (File file : files) {
            String baseName = file.getName();
            if (file.isDirectory() && !baseName.startsWith(DISABLED_PREFIX)) {
                list.add(file);
            }
        }
        // 升序排序
        Collections.sort(list, (o1, o2) -> Long.compare(Long.parseLong(o1.getName()), Long.parseLong(o2.getName())));
        if (!list.isEmpty()) {
            return list.get(0);
        }
        return null;
    }
}
